#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+4,inf=1e18;
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
	return x*f;
}
int n,m,mm,q,c[N],a[N][6],lstans;
struct matrix{
	int a[10][10],b[5];
    void init(){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
    }
	matrix operator +(matrix B){
		matrix C;
		for(int i=0;i<mm;i++)
			for(int j=0;j<mm;j++){
				int mx=-inf;
				for(int k=0;k<m;k++)
					mx=max(mx,max(max(a[i][k]+B.a[k+m][j],a[i][k+m]+B.a[k][j]),a[i][k]+B.a[k][j]));
				C.a[i][j]=mx;
			}
		for(int i=0;i<mm;i++)
			for(int p=m;p<mm;p++)
				if(a[i][p]>=0)
					for(int k=m;k<mm;k++)
						for(int j=0;j<mm;j++)
							C.a[i][j]=max(C.a[i][j],a[i][p]+B.a[k][j]);
		for(int i=0;i<m;i++){
			C.b[i]=b[i]+B.b[i];
			for(int j=0;j<mm;j++)
				C.a[i][j]=max(C.a[i][j],b[i]+max(B.a[i][j],B.a[i+m][j])),
				C.a[j][i]=max(C.a[j][i],max(a[j][i],a[j][i+m])+B.b[i]);
		}
		return C;
	}
}t[N<<1],ans;
void out(matrix x){
	for(int i=0;i<mm;i++){
		for(int j=0;j<mm;j++){
			cerr<<x.a[i][j]<<" ";
		}
		cerr<<"\n";
	}
	for(int i=0;i<m;i++) cerr<<x.b[i]<<" ";
	cerr<<"\n";
}
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
void build(){
	matrix xxx;
    for(int y=1;y<=n;y++){
        int x=y+n-1;
		for(int i=0;i<mm;i++)
			for(int j=0;j<mm;j++) t[x].a[i][j]=-inf;
		t[x].a[c[y]+m][c[y]+m]=a[y][c[y]];
		for(int i=0;i<m;i++)
			t[x].b[i]=a[y][i];
		if(y==1) xxx=t[x];
		else xxx=xxx+t[x];
    }
    for(int i=n-1;i;i--)
        t[i]=t[ls(i)]+t[rs(i)];
}
void update(int x){
    int l=x;
    x+=n-1;
	for(int i=m;i<mm;i++) t[x].a[i][i]=-inf;
	t[x].a[c[l]+m][c[l]+m]=a[l][c[l]];
    for(x>>=1;x;x>>=1)
        t[x]=t[ls(x)]+t[rs(x)];
}
matrix query(int l,int r){
    matrix lans,rans;
    lans.init(),rans.init();
    bool bjl=0,bjr=0;
    for(l+=n-1,r+=n;l<r;l>>=1,r>>=1){
        if(l&1){
            if(!bjl) lans=t[l++],bjl=1;
            else lans=lans+t[l++];
        }
        if(r&1){
            if(!bjr) rans=t[--r],bjr=1;
            else rans=t[--r]+rans;
        }
    }
	if(!bjl) return rans;
	if(!bjr) return lans;
	if(!bjl&&!bjr) cerr<<"NO";
    return lans+rans;
}
signed main() {
    freopen("paint.in","r",stdin);
    freopen("paint.out","w",stdout);
	n=read(),m=read(),q=read();
	mm=m+m;
	for(int i=1;i<=n;i++) c[i]=read()-1;
	for(int i=1;i<=n;i++) 
		for(int j=0;j<m;j++) a[i][j]=read();
	build();
	ans=query(1,n);
	lstans=0;
	for(int i=m;i<mm;i++)
		for(int j=m;j<mm;j++)
			lstans=max(lstans,ans.a[i][j]);
    cout<<lstans<<"\n";
    while(q--){
		int op=read(),l=read()^lstans,r=read()^lstans;
		if(op==1) c[l]=r-1,update(l);
		else{
			ans=query(l,r);
			lstans=0;
			for(int i=m;i<mm;i++)
				for(int j=m;j<mm;j++) lstans=max(lstans,ans.a[i][j]);
			cout<<lstans<<"\n";
		}
	}
	return 0;
}